/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CONTABILIDAD_CONTROLADOR;

import CONTABILIDAD_MODELO.CON_AJUSTE_REDONDEO;
import CONTABILIDAD_MODELO.CON_MONEDA;
import Conexion.Conexion;
import RRHH_Modelo.RHH_USUARIO;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 *
 * @author equipo_4
 */
@WebServlet(name = "CON_MONEDA_CONTROLLER", urlPatterns = {"/CON_MONEDA_CONTROLLER"})
public class CON_MONEDA_CONTROLLER extends HttpServlet {

    /**
     * Processes requests for both HTTP
     * <code>GET</code> and
     * <code>POST</code> methods.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        PrintWriter out = response.getWriter();
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /**
     * Handles the HTTP
     * <code>GET</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }

    /**
     * Handles the HTTP
     * <code>POST</code> method.
     *
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            String proceso=request.getParameter("proceso");
            RHH_USUARIO usuario = ((RHH_USUARIO)request.getSession().getAttribute("usr"));
            Conexion con = new Conexion(usuario.getUSUARIO(), usuario.getPASSWORD());
                   
            String html="";
            switch(proceso){
                case "actualizarDatos":
                    html=actualizarDatos(request, con);
                    break;
                case "crearMoneda":
                    html=crearMoneda(request, con);
                    break;
               case "actualizarMoneda":
                    html=actualizarMoneda(request, con);
                    break;
               case "listamonedas":
                    html=listamonedas(request, con);
                    break;
               case "listafechas":
                    html=listafechas(request, con);
                    break;
               case "listamonedasxfechas":
                    html=listamonedasxfechas(request, con);
                    break;                        
            }
            
            response.setCharacterEncoding("UTF-8");
            response.setContentType("text/plain");
            response.getWriter().write(html);
            con.Close();
            
        } catch (SQLException ex) {
            Logger.getLogger(CON_MONEDA_CONTROLLER.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ParseException ex) {
            Logger.getLogger(CON_MONEDA_CONTROLLER.class.getName()).log(Level.SEVERE, null, ex);
        }
        
    }
    
    public String crearMoneda(HttpServletRequest request, Conexion con ){
        String desc=request.getParameter("desc");
        String acro=request.getParameter("acro");
        double compra=Double.parseDouble(request.getParameter("compra"));
        double venta=Double.parseDouble(request.getParameter("venta"));
        double tp=Double.parseDouble(request.getParameter("tp"));
        CON_MONEDA moneda=new CON_MONEDA(tp, compra, venta, acro, desc, 0);
        moneda.setCon(con);
        try {
           moneda.Insertar();
        } catch (Exception e) {
            return "false";
        }
        return "true";
    }
    
    public String listamonedas(HttpServletRequest request, Conexion con ){
        String data="[";
        CON_MONEDA con_moneda = new CON_MONEDA();
        con_moneda.setCon(con);
        List<CON_MONEDA> lista = con_moneda.Todos();
        
        for (int i = 0; i < lista.size(); i++) {
            if(lista.get(i).getMONEDA_BASE()!=0)
            {
                if(lista.get(i).getACRONIMO().contains("€"))
                {
                    data+="\""+lista.get(i).getACRONIMO().replace("€", "E")+"\",";
                }
                else
                data+="\""+lista.get(i).getACRONIMO()+"\",";
            }
        }
        data=data.substring(0, data.length()-1);
        data+="]";
        
        return data;
    }
    public String listafechas(HttpServletRequest request, Conexion con ) throws SQLException{
        
        String consulta = "select DISTINCT(CON_COMPROBANTE.FECHA)\n" +
                            "FROM BROKER.CON_COMPROBANTE, BROKER.CON_MONEDA, BROKER.CON_TIPO_DE_CAMBIO\n" +
                            "WHERE (CON_TIPO_DE_CAMBIO.ID_COMPROBANTE = CON_COMPROBANTE.ID)\n" +
                            "AND (CON_TIPO_DE_CAMBIO.ID_MONEDA = CON_MONEDA.ID)"+ 
                            "ORDER BY CON_COMPROBANTE.FECHA";
        
        ResultSet rs = con.EjecutarConsulta(consulta);
        String data="";
        
        while(rs.next())
        {            
             data+=rs.getDate("FECHA")+",";
        }
        data=data.substring(0, data.length()-1);
        return data;
    }
    
    public String listamonedasxfechas(HttpServletRequest request, Conexion con ) throws SQLException, ParseException{
        CON_AJUSTE_REDONDEO red = new CON_AJUSTE_REDONDEO();
        String fecha = request.getParameter("fecha");
        String data="[";
        
        StringTokenizer token = new StringTokenizer(fecha,",");
        
        while(token.hasMoreTokens())            
        {
            fecha = token.nextToken();
            String consulta = "SELECT DISTINCT(CON_COMPROBANTE.FECHA),\n" +
                                "CON_TIPO_DE_CAMBIO.TIPO_CAMBIO,\n" +
                                "CON_MONEDA.ACRONIMO\n" +
                                "FROM BROKER.CON_COMPROBANTE, BROKER.CON_MONEDA, BROKER.CON_TIPO_DE_CAMBIO\n" +
                                "WHERE (CON_TIPO_DE_CAMBIO.ID_COMPROBANTE = CON_COMPROBANTE.ID)\n" +
                                "AND (CON_TIPO_DE_CAMBIO.ID_MONEDA = CON_MONEDA.ID)\n" +
                                "AND (CON_MONEDA.MONEDA_BASE <>0)\n"+
                                "and CON_COMPROBANTE.FECHA = to_date('"+fecha+"','yyyy-MM-dd')\n" +
                                "ORDER BY CON_MONEDA.ACRONIMO";

          
            ResultSet rs = con.EjecutarConsulta(consulta);
            data+="{";
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
            Date fechan = format.parse(fecha);
            
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(fechan); // Configuramos la fecha que se recibe
            calendar.add(Calendar.DAY_OF_YEAR, 1);
            
            data+="\"date\":\""+format.format(calendar.getTime())+"\",";
            String comp="";
            Double sumador=0.0;
            int divisor=0;
            int ingrsos=0;
            while(rs.next())
            {
                String actual = rs.getString("ACRONIMO");
                if(actual.contains("€"))
                {
                    actual=actual.replace("€", "E");
                }
                if(ingrsos==0)
                {
                    comp = actual;
                    ingrsos++;
                }

                if(comp.equals(actual))
                {
                    sumador+=rs.getDouble("TIPO_CAMBIO");
                    divisor++;
                }
                else
                {
                    data+="\""+comp+"\":\""+red.truncarDecimal((sumador/divisor))+"\",";

                    sumador = rs.getDouble("TIPO_CAMBIO");
                    divisor=1;
                    comp = actual;
                }                         
            }
            data+="\""+comp+"\":\""+red.truncarDecimal((sumador/divisor))+"\"";        
            data+="},";
        }
        data=data.substring(0, data.length()-1);
        return data+"]";
    }
    
    
    public String actualizarDatos(HttpServletRequest request, Conexion con ){
        CON_MONEDA con_moneda = new CON_MONEDA();
        con_moneda.setCon(con);
        List<CON_MONEDA> Lista = con_moneda.Todos();
        String html="<table><thead>";
        html+="<th>DESCRIPCION</th><th>ACRONIMO</th>";
        html+="<th>T/C</th><th>T/C VENTA</th><th>T/C COMPRA</th>";
        html+="<th>M.B</th><th>M.I</th><th>M.R</th></thead>";
        html+="<tbody>";
        for(int i =0; i<Lista.size(); i++)
        {
            html+="<tr>";
            html+="<td name='idmoneda' data-id='"+Lista.get(i).getID()+"'>";
            html+=Lista.get(i).getDESCRIPCION();
            html+="</td>";
            html+="<td>";
            html+=Lista.get(i).getACRONIMO();
            html+="</td>";
            html+="<td>";
            html+=Lista.get(i).getTIPO_DE_CAMBIO();
            html+="</td>";
            html+="<td>";
            html+=Lista.get(i).getTIPO_DE_CAMBIO_VENTA();
            html+="</td>";
            html+="<td>";
            html+=Lista.get(i).getTIPO_DE_CAMBIO_COMPRA();
            html+="</td>";
            html+="<td>";
            if(Lista.get(i).getMONEDA_BASE()==0)
                html+="<input type='radio' name='mb' checked>";
            else
                html+="<input type='radio' name='mb'>";
            html+="</td>";
            html+="<td>";
            if(Lista.get(i).getMONEDA_BASE()==2)
                html+="<input type='radio' name='mi' checked>";
            else
                html+="<input type='radio' name='mi'>";
            html+="</td>";
            html+="<td>";
            if(Lista.get(i).getMONEDA_BASE()==1)
                html+="<input type='radio' name='mr' checked>";
            else
                html+="<input type='radio' name='mr'>";
            html+="</td>";
            html+="</tr>";
        }
        html+="</tbody></table><br>";
        html+="<button id='guardar' onclick='guardarCambios()' style='display: none;' class='centrado mediano'>GUARDAR CAMBIOS</button>";
        return html;
    }
    public String actualizarMoneda(HttpServletRequest request, Conexion con ){
        CON_MONEDA con_moneda = new CON_MONEDA();
        con.Transacction();
        con_moneda.setCon(con);
        int length=Integer.parseInt(request.getParameter("monedaLeng"));
        try{
            for (int i = 0; i < length; i++) {
               double id =Double.parseDouble(request.getParameter("moneda[" + i + "][id]"));
               double tipo =Double.parseDouble(request.getParameter("moneda[" + i + "][tipo]"));
               double tc =Double.parseDouble(request.getParameter("moneda[" + i + "][tc]"));
               double tcc =Double.parseDouble(request.getParameter("moneda[" + i + "][tcc]"));
               double tcv =Double.parseDouble(request.getParameter("moneda[" + i + "][tcv]"));
               con_moneda=con_moneda.BuscarXid(id);
               con_moneda.setTIPO_DE_CAMBIO(tc);
               con_moneda.setTIPO_DE_CAMBIO_COMPRA(tcc);
               con_moneda.setTIPO_DE_CAMBIO_VENTA(tcv);
               con_moneda.setMONEDA_BASE(tipo);
               con_moneda.update();
            }   
        }catch(Exception e){
            con.rollback();
            return "false";
        }
        con.commit();
        return "true";
    }

    /**
     * Returns a short description of the servlet.
     *
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>
}
